// either函子本质上就是两个函子组合的，一个函子走正确的逻辑，另外一个函子用来捕捉错误信息
class Left {
  static of (value) {
    return new Left(value)
  }
  constructor(value) {
    this._value = value;
  }
  map (fn) {
    return this
  }
}
class Right {
  static of (value) {
    return new Right(value)
  }
  constructor(value) {
    this._value = value;
  }
  map (fn) {
    return Right.of(fn(this._value))
  }
}

// let r1 = Right.of(12).map(x => x + 2)
// let r2 = Left.of(12).map(x => x + 2)
// console.log(r1)
// console.log(r2)
function parseJSON (str) {
  try {
    return Right.of(JSON.parse(str))
  } catch (e) {
    return Left.of({ error: e.message })
  }
}
// let r = parseJSON('{ name: zs }')
// console.log(r)
let r = parseJSON('{ "name": "zs" }')
  .map(x => x.name.toUpperCase())
console.log(r)
